/*
    Rust的异步编程，被称为无栈协程
*/

use anyhow::Result;
use serde::Deserialize;

// # 与Java中的注解作用相似。
// 1.derive 关键字，用于自动实现 Deserialize 和 Debug 特性。
//     1.1. Deserialize（用于JSON的反序列化）
//     1.2. Debug（用于用于支持通过 println!("{:?}", ...) 打印结构体的调试信息） 特性。
#[derive(Deserialize, Debug)]
struct Joke {
    joke: String,
}

// 这是 属性宏（一种特殊的属性），由 tokio 异步运行时提供
// Rust 标准的 main 函数不能是异步的（不能用 async fn 定义），而这个宏会帮你把 async main 函数包装成一个普通的 main 函数，并自动初始化 Tokio 异步运行时环境。
#[tokio::main]
pub async fn main() -> Result<()> {
    let res = reqwest::get("https://geek-jokes.sameerkumar.website/api?format=json").await?;
    let joke = res.json::<Joke>().await?;
    println!("异步执行：读取json的属性:{}", joke.joke);
    Ok(())
}